// 对自身调用
// function f1(para1, para2) {
//     f1(para1, para2);
// }

// 间接对自身的调用
// function f1() {
//     f2();
// }

// function f2() {
//     f1();
// }

// //以下代码不规范！

// function test(para) {
//     //定义一个基线
//     if (para == true) {
//         return true;
//     }
//     test();
// }


//求n的阶乘
//输入n；输出n的阶乘
// function factorial(n) {
//     //1.基线
//     //2.自身调用
//     if (n === 1 || n == 0) {
//         return 1;
//     } else {
//         return n * factorial(n - 1);
//     }
// }
// console.log(factorial(5));



//斐波那契数列
//求第n斐波那契数
// function fibonacci(n) {
//     if (n < 1) {
//         return 0;
//     }
//     if (n <= 2) {
//         return 1;
//     }
//     //自身调用
//     return fibonacci(n - 1) + fibonacci(n - 2);

// }
// console.log(fibonacci(6));


//记忆化
//保存前一个结果，需要的时候直接进行调用；
//用数组将结构提前保存起来


//数组cache
function fibonacci2(n) {
    // //基线
    // if (n < 1) {
    //     return 0;
    // }
    // if (n <= 2) {
    //     return 1;
    // }

    //初始化，存储fibonacci的前两个数字
    const cache = [0, 1];
    if (cache[n] != null) {
        return cache[n];
    }
    //递归，调用自身

    //自身调用
    return cache[n] = fibonacci2(n - 1) + fibonacci2(n - 2);
}
console.log('记忆化', fibonacci2(6));


//链表的逆置

//head-->node
// function reserve(head) {
//     //基线条件
//     if (head.next == null) {
//         //返回head
//         return head;
//     }
//     //调用自身
//     let restNode = reserve(head.next);

//     //逆置
//     let current = head.next;
//     current.next = head;
//     head.next = undefined;

//     this.head = restNode;
//     return this.head;
// }

// //list
// reserve(list.head);